import { createAlova, type AlovaOptions } from 'alova';
import { xhrRequestAdapter } from '@alova/adapter-xhr';
import { createServerTokenAuthentication } from 'alova/client';
import VueHook from 'alova/vue';

declare type Meta = {
  ignoreToken?: boolean
  isDownload?: boolean
}

const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication({
  // ...
});


const options: AlovaOptions<any> = {
  requestAdapter: xhrRequestAdapter(),
  statesHook: VueHook,
  cacheFor: null,
  beforeRequest(method) {
    const meta: Meta = method.meta;
    // 假设我们需要添加token到请求头
    //method.config.headers.token = '';
    if (meta?.ignoreToken) {
      method.config.headers.token = '';
    }else{

    }
  },
  responded: {
    // 请求成功的拦截器
    // 当使用 `alova/fetch` 请求适配器时，第一个参数接收Response对象
    // 第二个参数为当前请求的method实例，你可以用它同步请求前后的配置信息
    onSuccess: async (response, method) => {
      if (response.status>=200 && response.status<299){
        const meta: Meta = method.meta;
        if (meta?.isDownload){
          return response.blob();
        }
        const headers = response.headers;
        console.log(headers)
        console.log(response)
        if (headers['content-type'].includes('application/json')){
          const json = await response.json();
          console.log(json)
          return json;
        }else{
          return response.data;
        }
      }
    },

    // 请求失败的拦截器
    // 请求错误时将会进入该拦截器。
    // 第二个参数为当前请求的method实例，你可以用它同步请求前后的配置信息
    onError: (err, method) => {
      console.log(method);
      alert(err.message);
    },

    // 请求完成的拦截器
    // 当你需要在请求不论是成功、失败、还是命中缓存都需要执行的逻辑时，可以在创建alova实例时指定全局的`onComplete`拦截器，例如关闭请求 loading 状态。
    // 接收当前请求的method实例
    onComplete: async (method) => {
      console.log(method);
      // 处理请求完成逻辑
    }
  },
}

const api = createAlova({
  ...options
});


export default api